home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORGI3 / DECSYX.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-03  |  2.0 KB  |  106 lines

  1. // decsyx: (c) 1996 by Günter Nagler
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <ctype.h>
  7. #include "filei3.hpp"
  8.  
  9. FILE* f = 0;
  10. long skip = 5;
  11. long count = 0;
  12.  
  13. char* inputname;
  14. char* outputname;
  15.  
  16. int main(int argc, char** argv)
  17. {
  18.   argc--; argv++;
  19.   while (argc > 0 && **argv == '-')
  20.   {
  21.     if (strnicmp(*argv, "-skip", 2) == 0)
  22.     {
  23.       argc--; argv++;
  24.       if (argc == 0 || !isxdigit(**argv))
  25.     fprintf(stderr, "option -skip needs a value\n");
  26.       else
  27.       {
  28.       char* endptr = 0;
  29.  
  30.     skip = strtoul(*argv, &endptr, 0);
  31.     if (endptr && *endptr)
  32.       fprintf(stderr, "%s is not a legal value\n", *argv);
  33.     argc--; argv++;
  34.       }
  35.       continue;
  36.     }
  37.     fprintf(stderr, "invalid option %s\n", *argv);
  38.     argc--; argv++;
  39.   }
  40.  
  41.   if (argc < 2)
  42.   {
  43.     fprintf(stderr, "usage: decsyx [-skip #] inputfile outputfile\n");
  44.     fprintf(stderr, "-skip\tskip sysex header (default: 5)\n");
  45.     return 1;
  46.   }
  47.   inputname = *argv++; argc--;
  48.   outputname = *argv++; argc--;
  49.   FILE* f = fopen(inputname, "rb");
  50.   if (!f)
  51.   {
  52.     perror(inputname);
  53.     return 1;
  54.   }
  55.   if (fgetc(f) != 0xF0)
  56.   {
  57.     fprintf(stderr, "%s does not contain standard sysex dumb\n");
  58.     return 1;
  59.   }
  60.   count = 1;
  61.   int c;
  62.  
  63.   while ((c = fgetc(f)) != EOF && c < 0x80)
  64.     count++;
  65.   if (c != 0xF7)
  66.   {
  67.     fprintf(stderr, "%s does not contain standard sysex dumb\n");
  68.     return 1;
  69.   }
  70.   count -= skip;
  71.   FILE* outf = fopen(outputname, "wb");
  72.   if (!outf)
  73.   {
  74.     perror(outputname);
  75.     return 1;
  76.   }
  77.   fseek(f, skip, SEEK_SET);
  78.   unsigned char dumb[8];
  79.   unsigned char byte[7];
  80.   int d, b;
  81.  
  82.   while (count > 0)
  83.   {
  84.     d = 8;
  85.     if (count < d)
  86.       d = (int)count;
  87.     d = fread(dumb, 1, d, f);
  88.     if (d <= 0)
  89.     {
  90.       fprintf(stderr, "unexpected end of file (file is too short)\n");
  91.       break;
  92.     }
  93.     b = code8to7(dumb, d, byte);
  94.     if (fwrite(byte, b, 1, outf) != 1)
  95.     {
  96.       perror(outputname);
  97.       break;
  98.     }
  99.     count -= d;
  100.   }
  101.  
  102.   fclose(outf);
  103.   fclose(f);
  104.   return 0;
  105. }
  106.